import java.util.HashMap;
public class writeSplit {
    public static void main(String[] args) {
        int[][] ans = new int[5][];
        ans[0] = new int[3*500000];
        ans[1] = new int[4*500000];
        ans[2] = new int[5*500000];
        ans[3] = new int[6*500000];
        ans[4] = new int[7*500000];
        //记录每个数组的长度
        int[] lens = {0,4,9,6,10,20};
        // 根据当前步数计算，你所处数组的起始位置
        HashMap<Integer,Integer> step2path = new HashMap<>();
        int[] path = new int[6];   // path[i] ：第ans[i]数组在ansCompact数组中的起点索引
        path[0]=0; //第一次数组的起始索引=0
        int[] stepDic = new int[6];   // stepDic[i] : 第ans[i]数组在 ansCompact 数组中的起始步数
        stepDic[0] = 0; //第一次数组的起始步数=0
        int total = 0;  //总步数= 所有ans的数组长度之和 4+9+6+10+20
        int totalLen = 0; // ansCompact数组长度 = 所有数组的长度 =  4*3+9*4+6*5+10*6+20*7
        for (int i = 1; i <=5; i++) {
            path[i]= path[i-1]+lens[i]*(i+2);   //与环数有关
            stepDic[i] =stepDic[i-1]+ lens[i];  //与环数无关
            step2path.put(stepDic[i],path[i]);
            total+=lens[i-1];
            totalLen+=path[i];
        }
        step2path.put(0,0);  // 第0步对应的 ansCompact 索引是0
        // 将 ans[0]、 ans[1]、 ans[2]、 ans[3]、 ans[4]使用 memcpy拷贝到 ansCompact
        int[] ansCompact = new int[totalLen]; // totalLen = 4*3+9*4+6*5+10*6+20*7;

        int step = total/4;  // 平均步数
        int start = 0;       // 起始步数
        int[][] plan = new int[4][2];//存储每个多线程任务的起点终点 plan[i][0]:起点  plan[i][1] 终点
        int index =0;
        while (start<total){
            int end = Math.max( start+step,total);//结束步数
            // 通过当前步子，计算任务的起点终点
            //
            plan[index][0] = step_index(start,lens,step2path);
            plan[index][1] = step_index(end,lens,step2path);
            start  = end;
        }
    }

    /**
     * 根据步数计算起点
     * @param curstep  步数  start
     * @param lens     每个环的数组长度 {0,4,9,6,10,20}
     * @return         返回curstep 在 ansCompact 的索引
     */
    public static int step_index(int curstep,int[] lens,HashMap<Integer,Integer> step2path){
        int[] cycle ={3,4,5,6,7};
        int c = 0; int i =0;
        while (c<curstep){
            if(c+lens[i]<curstep) //下一步还在未超过 curstep
                c = c+lens[i++];
            else break;
        }
        i--; //前面 i++多了1
        // 到此步时
        // c = 某个数组的步数起始位置
        // i = 该数组的环数
        int t = step2path.get(c); // 根据步数获取到 ansCompact 中的索引位置
        while (c<=curstep){
            t+=cycle[i];
            c++;
        }
        return t;
    }
}
